package org.stokesdrift.container; import java.io.File; import java.net.URI; import java.net.URL; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; import javax.servlet.ServletContext; import org.jruby.Ruby; import org.jruby.RubyInstanceConfig; import org.jruby.rack.servlet.DefaultServletRackContext; import org.jruby.rack.servlet.ServletRackConfig; import org.jruby.rack.servlet.ServletRackContext; import org.jruby.runtime.builtin.IRubyObject; import org.junit.Assert; import org.junit.Test; import org.powermock.api.mockito.PowerMockito; import org.stokesdrift.container.jruby.DriftRackApplicationFactory; public class DriftRackApplicationFactoryTest { @Test public void testLoadPaths() throws Exception { DriftRackApplicationFactory factory = new DriftRackApplicationFactory(); ServletContext servletContext = PowerMockito.mock(ServletContext.class); ServletRackConfig config = new ServletRackConfig(servletContext); ServletRackContext context = new DefaultServletRackContext(config); // Shouldn't add since the gems direction doesn't exist URL configRuFile = this.getClass().getClassLoader().getResource("examples/config.ru"); File file = new File(configRuFile.toURI()); String jrubyHome = file.getParent(); URI libUri = Ruby.class.getProtectionDomain().getCodeSource().getLocation().toURI(); File libDirectory = new File(libUri); System.setProperty("STOKESDRIFT_LIB_DIR",libDirectory.getParent()); System.setProperty("JRUBY_HOME",jrubyHome); System.setProperty("GEM_PATH","test/home/gem_path"); factory.init(context); Ruby runtime = factory.newRuntime(); Assert.assertNotNull(runtime); RubyInstanceConfig rackConfig = factory.getRuntimeConfig(); List<String> loadPaths = rackConfig.getLoadPaths(); Assert.assertTrue(loadPaths.size() > 0); Assert.assertTrue(loadPaths.contains("test/home/gem_path")); Assert.assertEquals(jrubyHome, rackConfig.getJRubyHome()); configRuFile = this.getClass().getClassLoader().getResource("examples/test_paths.rb"); byte[] scriptBytes = Files.readAllBytes(Paths.get(configRuFile.toURI())); IRubyObject rubyObject = runtime.executeScript(new String(scriptBytes), "test_paths.rb"); Assert.assertEquals("horray",rubyObject.asString().toString()); } }